﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ApplicationGenerator.CommonModule;
using System.ComponentModel;
using System.Drawing.Design;
using System.ComponentModel.Design;
using ApplicationGenerator.CommonForms;
using ApplicationGenerator.Versions.BusinessLogic;
using ApplicationGenerator.Versions.Forms;

namespace ApplicationGenerator.Lists.Web
{
    /// <summary>
    /// Akcja wywołująca metodę web serwisową
    /// </summary>
    [Serializable]
    public class ListActionInvokeWebService : ListActionBase, IWebServiceInvocation
    {
        #region Overrides
        /// <summary>
        /// Wykonuje akcję
        /// </summary>
        public override void ExecuteAction()
        {
            IList<int> selectedIds = ListControl.GetSelectedIds();
            if (selectedIds.Count == 0)
            {
                base.ListControl.AddErrorMessage("Nie zaznaczono żadnego elementu na liście");
                return;
            }


            WebServiceInvoker invoker = new WebServiceInvoker();
            bool error = false;
            foreach (var selectedId in selectedIds)
            {
                try
                {
                    invoker.Invoke(this, selectedId);
                }
                catch (Exception ex)
                {
                    ListControl.AddErrorMessage(string.Format("Błąd w trakcie wywoływania metody web serwis: {0}", ex.Message));
                    error = true;
                }
            }

            if (error)
            {
                return;
            }

            ListControl.Page.Response.Redirect(ListControl.Page.Request.Url.PathAndQuery);
        }

        /// <summary>
        /// Waliduje encję
        /// </summary>
        /// <param name="errorList">Lista błędów</param>
        /// <returns>Czy encja jest poprawna ?</returns>
        public override bool IsValid(ErrorEntity errorList)
        {
            bool isValid = base.IsValid(errorList);
            if (this.MetaModel == null || string.IsNullOrEmpty(this.MetaModel.Name))
            {
                errorList.ErrorStrings.Add("Należy podać meta model");
                isValid = false;
            }

            if (string.IsNullOrEmpty(this.WebServiceURL))
            {
                errorList.ErrorStrings.Add("Należy podać adres URL web serwisu");
                isValid = false;
            }

            if (string.IsNullOrEmpty(this.MethodName))
            {
                errorList.ErrorStrings.Add("Należy podać nazwę metody web serwisu");
                isValid = false;
            }

            if (this.MappingsConfiguration == null)
            {
                errorList.ErrorStrings.Add("Należy skonfigurować mapowania parametrów");
                isValid = false;
            }

            return isValid;
        }

        /// <summary>
        /// Zwraca nazwę akcji
        /// </summary>
        /// <returns>Nazwa akcji</returns>
        public override string ToString()
        {
            return "Akcja wywołaj web serwis";
        }
        #endregion

        #region IWebServiceInvocation Members
        /// <summary>
        /// Adres URL web serwisu
        /// </summary>
        [Category("Rozszerzone dane")]
        [DisplayName("Adres URL")]
        [Description("Adres URL web serwisu, który ma zostać wywołany")]
        [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
        public string WebServiceURL
        {
            get;
            set;
        }

        /// <summary>
        /// Nazwa metody do wykonania
        /// </summary>
        [Category("Rozszerzone dane")]
        [DisplayName("Nazwa metody")]
        [Description("Nazwa metody web serwisu, która ma zostać wywołana")]
        [Editor(typeof(MethodNameTypeEditor), typeof(UITypeEditor))]
        public string MethodName
        {
            get;
            set;
        }

        /// <summary>
        /// Mapowania parametrów
        /// </summary>
        [Category("Rozszerzone dane")]
        [DisplayName("Mapowania parametrów")]
        [Description("Mapowania pól ze struktury danych na parametry metody")]
        [Editor(typeof(MappingsEditor), typeof(UITypeEditor))]
        [TypeConverter(typeof(MappingsConverter))]
        public byte[] MappingsConfiguration
        {
            get;
            set;
        }

        /// <summary>
        /// Nazwa meta modelu, na podstawie którego będą wybierane mapowania
        /// </summary>
        [Browsable(false)]
        public string MetaModelName
        {
            get
            {
                if (MetaModel == null)
                {
                    return null;
                }

                return MetaModel.Name;
            }
        }

        /// <summary>
        /// Wersja meta modelu
        /// </summary>
        [Category("Rozszerzone dane")]
        [DisplayName("Model")]
        [Description("Model, z którego wybierane będą pola do mapowania na parametry metody web serwisu")]
        [TypeConverter(typeof(VersionConverter))]
        [Editor(typeof(VersionEditor), typeof(UITypeEditor))]
        [VersionType(VersionElement.Model)]
        public VersionInfo MetaModel
        {
            get;
            set;
        }
        #endregion
    }
}
